package main

import (
	"fmt"
	"os"
)

func main() {
	//read only
	//os.Open()

	//通用的
	//os.OpenFile()

	//create or truncate. RDWR
	name := "/Users/larryzeal/temp/text1.txt"
	{
		file, err := os.Create(name)
		if err != nil {
			panic(err)
		}
		defer func(file *os.File) {
			err := file.Close()
			if err != nil {
				fmt.Printf("close file err: %s\n", err.Error())
			}
		}(file)
		//file.Truncate()
		//file.Sync() //其实就是让系统落盘
		//file.Chdir() //修改当前工作路径为当前文件，嗯嗯，file必须是dir才行
		stat, _ := file.Stat()
		fmt.Printf(" - Size: %d\n", stat.Size())
		fmt.Printf(" - Name: %s\n", stat.Name())
		fmt.Printf(" - IsDir: %t\n", stat.IsDir())
		fmt.Printf(" - ModTime: %s\n", stat.ModTime())
	}

	//使用一个文件描述符和一个名字，创建一个新文件
	//原文件描述符就不可用了。
	//os.NewFile 是大多数人永远不会直接使用的低级函数。它采用一个已经存在的文件描述符(文件的系统表示)并将其转换为 *os.File(Go 的表示)。
	//os.NewFile()

	{
		//截断，只保留前n个 - 注意，不管n比原size大还是小。
		err := os.Truncate(name, 12345)
		if err != nil {
			panic(err)
		}
		file, _ := os.Open(name)
		stat, _ := file.Stat()
		fmt.Printf(" - Size: %d\n", stat.Size())
		fmt.Printf(" - Name: %s\n", stat.Name())
		fmt.Printf(" - IsDir: %t\n", stat.IsDir())
		fmt.Printf(" - ModTime: %s\n", stat.ModTime())
	}

}
